package ltd.hanamaki.review.unit.testn_g.paramter.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 工具类
 */
public class JDBCUtils_C3P0 {

    static Connection connection;
    static DataSource dataSource;
    static PreparedStatement preparedStatement;
    static ResultSet resultSet;
    static ResultSetMetaData metaData;

    /* 编写 一个 获取数据库连接信息的 方法 */
    static {
        dataSource = new ComboPooledDataSource("ls");
    }

    /* 编写 数据库连接 的方法 */
    public static Connection getCon() {
        try {
            connection=  dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    /* 释放资源 */
    public static void release(Connection connection, Statement statement, ResultSet resultSet, PreparedStatement preparedStatement) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException throwables) {
                System.out.println("sql异常");
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException throwables) {
                System.out.println("sql异常");
            }
        }
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                System.out.println("sql异常");
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException throwables) {
                System.out.println("sql异常");
            }
        }

    }


    /**
     * 调用此方法 所传的参数为：第一个是表名 其余的参数是要查询的字段名
     * @param param
     * @return
     */
    public static String[][] getSqlContent(Object[] param) {
        /* 定义一个 二维数组 */
        String[][] result = null;
        /* 获得 参数中 一个  有多少个 需要查询的  列 */
        int paramNum = param.length;
        try {
            connection = getCon();
            StringBuffer sql = new StringBuffer();
            sql.append("select ");
            for (int i = 1; i < paramNum; i++) {
                sql.append(param[i]);
                if (param.length - 1 != i) {
                    sql.append(",");
                }
            }
            sql.append(" from ").append(param[0]);

            System.out.println(sql.toString());

            preparedStatement = connection.prepareStatement(sql.toString());
            resultSet = preparedStatement.executeQuery();
            /* 获得表的描述性 对象 */
            metaData = resultSet.getMetaData();
            /* 获得表一共有多少列 */
            int columnCount = metaData.getColumnCount();

            /* 定义 一个 集合 保存每次取出一行数据 */
            List<String[]> list = new ArrayList<>();
            /* 只要下一行 有数据 就把一整行的 数据取出 暂存到 一维数组中 */
            while (resultSet.next()) {
                /* 创建一个 一维数组 来保存取出的每一个 数据 */
                String[] rows = new String[columnCount];
                for (int i = 0; i < columnCount; i++) {
                    rows[i] = String.valueOf(resultSet.getObject(i + 1));
                }
                list.add(rows);
            }

            /* 通过list  转为 二维数组 */
            result = new String[list.size()][];
            for (int i = 0; i < list.size(); i++) {
                result[i] = list.get(i);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils_C3P0.release(connection, null, resultSet, preparedStatement);
        }

        return result;
    }

}
